package com.bw.common.vm

import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.bw.common.model.BaseRepository
import com.bw.common.model.IResultData
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.newFixedThreadPoolContext
import kotlinx.coroutines.newSingleThreadContext
import java.util.concurrent.Executors

/**
 * 基础ViewModel层
 *
 * viewModel 和 AndroidViewModel的主要区别在于是否需要上下文对象
 *
 * viewModel中业务：
 * 1.利用协程获取网络请求
 * 2.使用liveData或StateFlow来管理数据
 * 3.通知View数据变化
 *
 * 注意：以前使用LiveData 来缓存数据，存在数据倒灌问题，官方推荐在kotlin中使用Flow流，如果是java中官方推荐SingeLiveEvent或unPeekLiveData
 *
 */
abstract class BaseViewModel:ViewModel() {
    //定义LiveData缓存数据
    val mError =MutableLiveData<String>()

    //协程异常处理
    private val mExceptionHandler = CoroutineExceptionHandler{ctx,exception->
        Log.e("error","Exception====>\n"+exception.message)
        mError.postValue("ViewModel层发生异常："+exception.message)
    }


    // 自定义协程作用域，SupervisorJob（）创建独立协程作用域，避免影响父协程和同级协程
    protected val mViewModelScope = CoroutineScope(Dispatchers.Main+ SupervisorJob()+mExceptionHandler)

    //自定义协程调度器（线程池）
    protected val mDispatcher = Executors.newFixedThreadPool(10).asCoroutineDispatcher()//使用Java的方式创建线程池

    protected val mSingeDispatcher = newSingleThreadContext("SingleTreadDispatcher")//使用kotlin中 函数创建单线程池

    protected val mFixedThreadDispatcher = newFixedThreadPoolContext(16,"SingleTreadDispatcher")//使用kotlin中函数创建固定数量线程池

}























